package com.example.apitesttool.agent;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 智能体节点抽象基类
 * 提供通用的节点实现逻辑
 */
public abstract class AbstractAgentNode implements AgentNode {
    
    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
    
    private final String nodeName;
    private final String nodeDescription;
    
    public AbstractAgentNode(String nodeName, String nodeDescription) {
        this.nodeName = nodeName;
        this.nodeDescription = nodeDescription;
    }
    
    @Override
    public String getNodeName() {
        return nodeName;
    }
    
    @Override
    public String getNodeDescription() {
        return nodeDescription;
    }
    
    @Override
    public AgentNodeResult execute(AgentState state) {
        logger.debug("开始执行节点: {} - {}", getNodeName(), getNodeDescription());
        
        try {
            // 执行前检查
            if (!canExecute(state)) {
                String message = "节点执行条件不满足: " + getNodeName();
                logger.warn(message);
                return AgentNodeResult.failure(message);
            }
            
            // 执行具体逻辑
            AgentNodeResult result = doExecute(state);
            
            // 执行后处理
            if (result.isSuccess()) {
                logger.debug("节点 {} 执行成功: {}", getNodeName(), result.getMessage());
            } else {
                logger.warn("节点 {} 执行失败: {}", getNodeName(), result.getMessage());
            }
            
            return result;
            
        } catch (Exception e) {
            logger.error("节点 {} 执行异常", getNodeName(), e);
            return AgentNodeResult.failure("节点执行异常: " + e.getMessage());
        }
    }
    
    /**
     * 子类需要实现的具体执行逻辑
     * @param state 智能体状态
     * @return 执行结果
     */
    protected abstract AgentNodeResult doExecute(AgentState state);
    
    /**
     * 记录节点执行日志
     * @param state 智能体状态
     * @param message 日志消息
     */
    protected void logExecution(AgentState state, String message) {
        logger.info("[步骤 {}] {}: {}", state.getStepCount(), getNodeName(), message);
    }
    
    /**
     * 创建成功结果并指定下一个节点
     * @param message 结果消息
     * @param nextNodeName 下一个节点名称
     * @return 节点结果
     */
    protected AgentNodeResult successWithNext(String message, String nextNodeName) {
        return AgentNodeResult.continueWith(nextNodeName, message);
    }
    
    /**
     * 创建完成结果（停止执行）
     * @param message 结果消息
     * @return 节点结果
     */
    protected AgentNodeResult complete(String message) {
        return AgentNodeResult.complete(message);
    }
    
    /**
     * 创建失败结果
     * @param message 错误消息
     * @return 节点结果
     */
    protected AgentNodeResult failure(String message) {
        return AgentNodeResult.failure(message);
    }
}

